package com.evan.review.eventdispatch;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

import androidx.appcompat.widget.AppCompatButton;

/**
 * 自定义Button，用于演示事件分发机制
 * 通过重写事件分发相关方法，展示事件流向
 */
public class MyButton extends AppCompatButton {

    private boolean consumeEvent = true;

    public MyButton(Context context) {
        super(context);
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 设置是否消费事件
     */
    public void setConsumeEvent(boolean consumeEvent) {
        this.consumeEvent = consumeEvent;
    }

    /**
     * 事件分发方法
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        EventExampleActivity activity = EventExampleActivity.getInstance(this);
        if (activity != null) {
            activity.appendLog("MyButton - dispatchTouchEvent: " + getEventName(event));
        }

        boolean result = super.dispatchTouchEvent(event);

        if (activity != null) {
            activity.appendLog("MyButton - dispatchTouchEvent 返回: " + result);
        }

        return result;
    }

    /**
     * 事件处理方法
     * View没有onInterceptTouchEvent方法
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        EventExampleActivity activity = EventExampleActivity.getInstance(this);
        
        if (activity != null) {
            activity.appendLog("MyButton - onTouchEvent: " + getEventName(event) + 
                    (consumeEvent ? " (消费)" : " (不消费)"));
            
            // 当DOWN事件到达按钮时，说明事件成功传递到了按钮
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                activity.showEventConsumedToast("事件成功传递到按钮");
            }
        }
        
        // 当ACTION_UP事件发生且我们消费事件时，显示Toast (但不是通过onClick方法触发的)
        // 当通过onTouchEvent方式消费时才显示这个Toast
        if (event.getAction() == MotionEvent.ACTION_UP && consumeEvent && activity != null && !isPerformingClick()) {
            activity.showEventConsumedToast("按钮onTouchEvent消费");
        }
        
        // 如果设置为不消费，则调用super前设置不可点击，这样Button默认也不会消费事件
        if (!consumeEvent) {
            boolean clickable = isClickable();
            setClickable(false);
            boolean result = super.onTouchEvent(event);
            // 恢复原有状态
            setClickable(clickable);
            return result;
        } else {
            return super.onTouchEvent(event);
        }
    }

    /**
     * 判断是否正在执行点击操作
     * 这个方法用于区分通过onClick和onTouchEvent两种方式的事件消费
     */
    private boolean isPerformingClick() {
        // 简单实现，实际上不太准确，但对于演示够用了
        return isClickable() && isPressed();
    }

    /**
     * 获取事件名称
     */
    private String getEventName(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return "ACTION_DOWN";
            case MotionEvent.ACTION_MOVE:
                return "ACTION_MOVE";
            case MotionEvent.ACTION_UP:
                return "ACTION_UP";
            case MotionEvent.ACTION_CANCEL:
                return "ACTION_CANCEL";
            default:
                return "OTHER";
        }
    }
} 